package com.hrt.datasender.process.strategy.hj212;

import com.btcode.db.result.Row;
import com.btcode.db.sqlparameter.SQLParameterList;
import com.hrt.datasender.datadao.model.BcSendPlatformModel;
import com.hrt.datasender.datadao.service.BdSendRecordService;
import com.hrt.datasender.datastorage.StorageDataType;
import com.hrt.datasender.process.indentity.hj212.MessageModel;
import com.hrt.datasender.process.strategy.IProcessStrategy;
import com.hrt.datasender.process.strategy.hj212.util.DataType;
import com.hrt.db.DBManager;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

public class Com9014NSProcess implements IProcessStrategy {

    @Override
    public String getCommandId() {
        // TODO Auto-generated method stub
        return "9014";
    }

    @Override
    public String getStrategyName() {
        return "南山站数据接收反馈";
    }

    @Override
    public Object packet(List<Row> data, BcSendPlatformModel platform) {
        return null;
    }

    @Override
    public Object packetReissue(List<Row> data, BcSendPlatformModel platform) {
        return null;
    }

    /**
     * 南山区站平台反馈报文：
     * ##0070QN=20201230103610000;ST=21;PW=123456;MN=77777770020001;CN=9014;CP=&&&&5280
     * 该报文特点：只有发送报文的QN信息，没有发送报文的CN信息（发送报文与反馈报文必须对应上）
     * @param data
     * @param sendPlatform
     * @throws Exception
     */
    @Override
    public void decode(MessageModel data, BcSendPlatformModel sendPlatform) throws Exception {

        String msg = data.getMsg() + "";
        String qn = msg.substring(msg.indexOf("QN=")+3,msg.indexOf(";ST="));
        String ip = sendPlatform.getIp();
        String port = sendPlatform.getPort();
        StorageDataType dataType = null;

        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        Date dateTime = sf.parse(qn);
        /**
         * 判断返回的QN时间超过当前时间往后推30天的话，认为是补传数据，不进行相应数据更新
         */
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY,30);
        Date compareTime = cal.getTime();
        if(dateTime.compareTo(compareTime)>0){
            return;
        }

        /**
         * 以南山平台现有机制，有可能出现多个相同QN的情况，
         * 这里忽视这种情况，只要收到反馈报文，就把查到的所有命令全部更新
         * 后果：极端情况下，会出现数据缺漏的情况（几率非常小，比完全不要反馈报文，可靠性强很多）
         */
        String sql = "SELECT t.id,t.DATA_TYPE\n" +
                "  FROM BD_SEND_RECORD t\n" +
                " WHERE t.ip = '"+ip+"'" +
                "   AND t.PORT = '"+port+"'" +
                "   AND t.QN = '"+qn+"'";
        List<Row> rows = DBManager.getDataExecuter().queryList(sql,null);
        if(rows.size()==0){
            return;
        }

        for(Row row:rows){
            String strDataType = row.getSafeString("DATA_TYPE");
            switch (strDataType){
                case "SECOND":
                    dataType = StorageDataType.SECOND;
                    break;
                case "MINUTES":
                    dataType = StorageDataType.MINUTES;
                    break;
                case "HOUR":
                    dataType = StorageDataType.HOUR;
                    break;
                case "DAY":
                    dataType = StorageDataType.DAY;
                    break;
                default:
                    break;
            }

            BdSendRecordService.getInstance().updateLastSendDate(dataType, ip, port, dateTime);
        }
    }

}
